class AsyncParralleHook { // 钩子 是同步的

  constructor(args) { // args => ['name']
    this.tasks = [];

  }

  tapAsync(name, task) {// 事件名字 事件方法
    this.tasks.push(task);
  }

  callAsync(...args) {
    let finalCallback = args.pop(); // 获取传入参数的最后一个，即回调函数
    let index = 0;
    let done = () => { // 原理像 Promise.all()
      index++;
      if (index === this.tasks.length) {
        finalCallback();
      }
    };
    this.tasks.forEach((task) => {
      task(...args, done);
    })
  }

}

let hook = new AsyncParralleHook(['name']);
let total = 0;
hook.tapAsync('react', (name, cb) => {
  setTimeout(() => {
    console.log('react', name);
    cb();
  }, 1000);
});

hook.tapAsync('vue', (name, cb) => {
  setTimeout(() => {
    console.log('vue', name);
    cb();
  }, 1000);
});


hook.callAsync('gzw', () => {
  console.log('end');
});
